// Copyright 2021 by 马万里. All rights reserved.
// 开发团队 ：   鸡中之霸
// 开发人员 ：   马万里
// 开发时间 ：   2021/2/22 11:43
// 文件名称 ：   ops.go
// 工程名称 ：   videostream
// 开发工具 ：   GoLand
//

package session

import (
	"fmt"
	"johnsonsmile.com/videostream/api/dbops"
	"johnsonsmile.com/videostream/api/defs"
	"johnsonsmile.com/videostream/api/utils"
	"sync"
	"time"
)

var sessionMap *sync.Map

func init() {
	sessionMap = &sync.Map{}
}

func LoadSessionFromDB() {
	r, err := dbops.RetrieveAllSessions()
	if err != nil {
		return
	}
	r.Range(func(key, value interface{}) bool {
		ss := value.(*defs.SimpleSession)
		sessionMap.Store(key, ss)
		return true
	})
}

func GenerateNewSessionId(username string) string {
	uuid, _ := utils.NewUUID()
	ct := time.Now().UnixNano() / 1000000
	ttl := ct + 30*60*1000 // 默认30分钟过期
	ss := &defs.SimpleSession{
		Username: username,
		TTL:      ttl,
	}
	sessionMap.Store(uuid, ss)
	fmt.Println(uuid)
	err := dbops.InsertSession(uuid, ttl, username)
	if err != nil {
		fmt.Println(err)
		return ""
	}
	return uuid
}

func IsSessionExpired(sessionId string) (string, bool) {
	if val, ok := sessionMap.Load(sessionId); !ok {
		return "", true
	} else {
		ss := val.(*defs.SimpleSession)
		now := time.Now().UnixNano() / 1000000
		if now > ss.TTL {
			// 过时了
			sessionMap.Delete(sessionId)
			_ = dbops.DeleteSession(sessionId)
			return "", true
		}
		return ss.Username, false
	}
}
